home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 076-100 / 092 / shar / shar.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  7KB  |  190 lines

  1. /*   Shar.c
  2.  
  3.      Copyright (c) 1987 by Fabbian G. Dufoe, III
  4.      All rights reserved.
  5.  
  6.      Permission is granted to redistribute this program provided the source
  7.      code is included in the distribution and this copyright notice is
  8.      unchanged.
  9.  
  10.      This program creates a Unix-compatible shell archive in the first file
  11.      named on the command line.  It packs all the command-line files after
  12.      the first into that archive.
  13.  
  14.      For each file to be included in the archive the program writes
  15.           echo "Creating filename"
  16.           cat > filename <<"***EOF filename***"
  17.      Then it writes a copy of the file and terminates it with
  18.           ***EOF filename***
  19.  
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <time.h>
  24. #ifdef AMIGA
  25. #include <error.h>
  26. #include <exec/types.h>
  27. #else
  28. #include <errno.h>
  29. #include <ctype.h>
  30. extern int sys_nerr;
  31. extern char *sys_errlist[];
  32. #endif
  33.  
  34. main(argc, argv)
  35. int argc;
  36. char **argv;
  37. {
  38.      int c;
  39.           /* The character or code returned by getc will be stored here. */
  40.  
  41.      int i;
  42.           /* This will be used as a loop counter to point to the command
  43.              line argument the program is processing. */
  44.  
  45.      FILE *in;
  46.           /* This is the file pointer which will be used to refer to the
  47.              current input file in the fgetc() and fclose() functions. */
  48.  
  49.      FILE *out;
  50.           /* This is the file pointer which will be used to refer to the
  51.              output file in the fputc() and fclose() functions. */
  52.  
  53.      int r;
  54.           /* The code returned by putc will be stored here. */
  55.  
  56.      long t;
  57.           /* The current time in seconds returned by the time() function
  58.              will be stored here.  The ctime() function will convert it to
  59.              an ASCII string for inclusion in the output file. */
  60.  
  61.      if (argc < 3)
  62.           /* There must be at least two files named for the program to work.
  63.              The first argument is always the program name.  The second is
  64.              the output file name.  The third is the first input file name.
  65.              Without at least one input file there is no point continuing.
  66.              The program will write an error message to standard error and
  67.              terminate. */
  68.      {
  69.           fprintf(stderr, "Usage: shar outputfile file[s]\n");
  70.           return(-1);
  71.      }
  72.  
  73.      if ((out = fopen(argv[1], "r")) == NULL)
  74.           /* We try to open the file for reading to see if it is there.  If
  75.              the open fails we check the error number to see why. */
  76.      {
  77.           if (errno == ENOENT)
  78.                /* An error number of ENOENT means the file doesn't exist.
  79.                   That's what we want, so we'll just open it. */
  80.  
  81.           {
  82.                if ((out = fopen(argv[1], "w")) == NULL)
  83.                     /* If we couldn't open the file for writing print an
  84.                        error message and terminate. */
  85.                {
  86.                     fprintf(stderr, "Shar: Couldn't open %s for output.\n",
  87.                             argv[1]);
  88.                     if (errno > 0 && errno < sys_nerr)
  89.                          /* If there is an entry in the system error list
  90.                             for this error, print the reason for the
  91.                             error. */
  92.                          fprintf(stderr, "\t%d: %s\n", errno,
  93.                                  sys_errlist[errno]);
  94.                     return(-1);
  95.                          /* Terminate with a code to indicate the program
  96.                             did not complete successfully. */
  97.                }
  98.           }
  99.           else
  100.                /* If the file open failed for any other reason we know it
  101.                   exists so we want to display the error message and
  102.                   terminate. */
  103.           {
  104.                fprintf(stderr, "Shar: %s already exists.\n", argv[1]);
  105.                return(-1);
  106.           }
  107.      }
  108.      else
  109.           /* If we were able to open the file we want to close it before we
  110.              print our error message and terminate. */
  111.      {
  112.           (void)fclose(out);
  113.                /* We don't care if fclose fails--we're going to terminate
  114.                   the program anyway--so we ignore the value it returns by
  115.                   casting it to a void. */
  116.           fprintf(stderr, "Shar: %s already exists.\n", argv[1]);
  117.           return(-1);
  118.      }
  119.  
  120.      /* If we got this far we succeeded in opening the output file for
  121.         writing. */
  122.  
  123.      time(&t);
  124.           /* We want to include the current time in the opening comments.
  125.              This function gets the number of seconds since the system's
  126.              base date. */
  127.  
  128.      /* Write some identifying comments to the beginning of the output
  129.         file. */
  130.      fprintf(out,
  131.         "# This is a shell archive.  Remove anything before this line,\n");
  132.      fprintf(out,
  133.         "# then unpack it by saving it in a file and typing \"sh file\"\n");
  134.      fprintf(out, "# Created %s#\n", ctime(&t));
  135.      fprintf(out, "# This archive contains:\n");
  136.  
  137.      for (i = 2; i < argc; i++)
  138.           /* Now we are going to list each of the remaining file names in a
  139.              comment line. */
  140.           fprintf(out, "#\t\t%s\n", argv[i]);
  141.  
  142.      for (i = 2; i < argc; i++)
  143.           /* Now we are going to copy each of the remaining file names
  144.              from the command line. */
  145.      {
  146.           if ((in = fopen(argv[i], "r")) == NULL)
  147.                /* Try to open the file for reading.  If the open fails write
  148.                   an error message. */
  149.           {
  150.                fprintf(stderr, "Shar: couldn't open %s for input.\n",
  151.                        argv[i]);
  152.                if (errno > 0 && errno < sys_nerr)
  153.                     /* If there is an entry in the system error list
  154.                        for this error, print the reason for the
  155.                        error. */
  156.                     fprintf(stderr, "\t%d: %s\n", errno,
  157.                             sys_errlist[errno]);
  158.           }
  159.           else
  160.                /* If the file was opened successfully add it to the output
  161.                   file. */
  162.           {
  163.                fprintf(out, "echo \"Creating %s\"\n", argv[i]);
  164.                fprintf(out, "cat > %s <<\"***EOF %s***\"\n", argv[i],
  165.                        argv[i]);
  166.                while ((c = getc(in)) != EOF)
  167.                     /* Read the entire input file and copy it to the output
  168.                        file. */
  169.                     if ((r = putc(c, out)) != c)
  170.                          /* If we couldn't write the character successfully
  171.                             print an error message and terminate. */
  172.                     {
  173.                          fprintf(stderr,
  174.                                  "Shar: couldn't write from %s to %s.\n",
  175.                                  argv[i], argv[1]);
  176.                          if (errno > 0 && errno < sys_nerr)
  177.                               /* If there is an entry in the system error
  178.                                  list for this error, print the reason for
  179.                                  the error. */
  180.                               fprintf(stderr, "\t%d: %s\n", errno,
  181.                                       sys_errlist[errno]);
  182.                          return(-1);
  183.                     }
  184.                fprintf(out, "***EOF %s***\n", argv[i]);
  185.                fclose(in);
  186.           }
  187.      }
  188.      return(0);
  189. }
  190.